package 动态查询条件构造器;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

/**
 * 简化的查询构建器，用于演示基于 Java JDK 的通用查询逻辑。
 */
public class QueryBuilder<T> {
    // 存储多个过滤条件（谓词）
    private final List<Predicate<T>> predicates = new ArrayList<>();

    /**
     * 添加一个等于（eq）条件
     *
     * @param fieldExtractor 函数式参数，用来提取对象的某个字段
     * @param value 要匹配的值
     * @return 当前构建器实例，支持链式调用
     */
    public <V> QueryBuilder<T> eq(java.util.function.Function<T, V> fieldExtractor, V value) {
        predicates.add(item -> {
            V fieldValue = fieldExtractor.apply(item);
            return fieldValue != null && fieldValue.equals(value);
        });
        return this;
    }

    /**
     * 添加一个包含（like）条件，使用字符串模糊匹配
     *
     * @param fieldExtractor 字符串字段提取器
     * @param value 匹配的关键字
     * @return 当前构建器实例
     */
    public QueryBuilder<T> like(java.util.function.Function<T, String> fieldExtractor, String value) {
        String pattern = value.toLowerCase();
        predicates.add(item -> {
            String fieldValue = fieldExtractor.apply(item);
            return fieldValue != null && fieldValue.toLowerCase().contains(pattern);
        });
        return this;
    }

    /**
     * 添加大于（gt）条件
     *
     * @param fieldExtractor 数值字段提取器
     * @param value 比较值
     * @return 当前构建器实例
     */
    public <C extends Comparable<C>> QueryBuilder<T> gt(java.util.function.Function<T, C> fieldExtractor, C value) {
        predicates.add(item -> {
            C fieldValue = fieldExtractor.apply(item);
            return fieldValue != null && fieldValue.compareTo(value) > 0;
        });
        return this;
    }

    /**
     * 构建最终的复合查询条件
     *
     * @return 合并后的 Predicate 对象
     */
    public Predicate<T> build() {
        return predicates.stream()
                .reduce(Predicate::and)
                .orElse(t -> true); // 默认无条件（全选）
    }
}